<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF--8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>小学数学交互设计资源</title>
    <script src="https://cdn.tailwindcss.com"></script>
    <style>
        body { font-family: 'Inter', sans-serif; }
        /* Custom scrollbar for webkit browsers */
        ::-webkit-scrollbar {
            width: 8px;
            height: 8px;
        }
        ::-webkit-scrollbar-track {
            background: #f1f1f1;
            border-radius: 10px;
        }
        ::-webkit-scrollbar-thumb {
            background: #888;
            border-radius: 10px;
        }
        ::-webkit-scrollbar-thumb:hover {
            background: #555;
        }
        .table-container {
            max-height: 60vh; /* Adjusted for more controls */
            overflow-y: auto;
        }
        th, td {
            min-width: 100px; 
            white-space: pre-wrap; 
            word-break: break-word; 
        }
        /* Modal styles */
        .modal {
            display: none; 
            position: fixed;
            z-index: 1000;
            left: 0;
            top: 0;
            width: 100%;
            height: 100%;
            overflow: auto;
            background-color: rgba(0,0,0,0.5); 
            align-items: center;
            justify-content: center;
        }
        .modal-content {
            background-color: #fefefe;
            margin: auto;
            padding: 20px;
            border: 1px solid #888;
            width: 80%;
            max-width: 600px;
            border-radius: 8px;
            box-shadow: 0 4px 8px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19);
            position: relative; 
        }
        .modal-header {
            padding-bottom: 10px;
            border-bottom: 1px solid #eee;
            font-size: 1.25rem;
            font-weight: bold;
            color: #333;
        }
        .modal-body {
            padding-top: 15px;
            padding-bottom: 15px;
            max-height: 60vh;
            overflow-y: auto;
            white-space: pre-wrap; 
        }
        .modal-footer {
            padding-top: 10px;
            border-top: 1px solid #eee;
            text-align: right;
        }
        .close-button {
            color: #aaa;
            float: right;
            font-size: 28px;
            font-weight: bold;
            position: absolute;
            top: 10px;
            right: 20px;
        }
        .close-button:hover,
        .close-button:focus {
            color: black;
            text-decoration: none;
            cursor: pointer;
        }
        .loader {
            border: 4px solid #f3f3f3; 
            border-top: 4px solid #3498db; 
            border-radius: 50%;
            width: 30px;
            height: 30px;
            animation: spin 1s linear infinite;
            margin: 20px auto;
        }
        @keyframes spin {
            0% { transform: rotate(0deg); }
            100% { transform: rotate(360deg); }
        }
    </style>
</head>
<body class="bg-gray-100 text-gray-800 p-4 md:p-8">

    <div class="container mx-auto bg-white p-6 rounded-lg shadow-xl">
        <header class="mb-6 text-center">
            <h1 class="text-2xl md:text-3xl font-bold text-blue-600">小学数学交互设计资源</h1>
            <p class="text-sm text-gray-500 mt-1">浏览和搜索不同年级与学期的数学交互设计内容。使用AI助教获取教学活动建议！</p>
        </header>

        <div class="controls-grid grid grid-cols-1 sm:grid-cols-2 md:grid-cols-2 lg:grid-cols-4 gap-4 mb-6 p-4 bg-gray-50 rounded-md">
            <div>
                <label for="gradeSelect" class="block text-sm font-medium text-gray-700 mb-1">选择年级 (Grade):</label>
                <select id="gradeSelect" class="w-full p-2 border border-gray-300 rounded-md shadow-sm focus:ring-blue-500 focus:border-blue-500">
                    <option value="3">三年级 (Grade 3)</option>
                    <option value="4">四年级 (Grade 4)</option>
                    <option value="5">五年级 (Grade 5)</option>
                    <option value="6">六年级 (Grade 6)</option>
                </select>
            </div>
            <div>
                <label for="semesterSelect" class="block text-sm font-medium text-gray-700 mb-1">选择学期 (Semester):</label>
                <select id="semesterSelect" class="w-full p-2 border border-gray-300 rounded-md shadow-sm focus:ring-blue-500 focus:border-blue-500">
                    <option value="1">上学期 (1st Semester)</option>
                    <option value="2">下学期 (2nd Semester)</option>
                </select>
            </div>
            <div>
                <label for="unitSelect" class="block text-sm font-medium text-gray-700 mb-1">选择单元 (Unit):</label>
                <select id="unitSelect" class="w-full p-2 border border-gray-300 rounded-md shadow-sm focus:ring-blue-500 focus:border-blue-500">
                    <option value="all">所有单元 (All Units)</option>
                </select>
            </div>
            <div>
                <label for="searchInput" class="block text-sm font-medium text-gray-700 mb-1">搜索内容 (Search):</label>
                <input type="text" id="searchInput" placeholder="输入关键词搜索..." class="w-full p-2 border border-gray-300 rounded-md shadow-sm focus:ring-blue-500 focus:border-blue-500">
            </div>
        </div>

        <div id="tableContainer" class="table-container overflow-x-auto rounded-lg border border-gray-200 shadow-sm">
            <table class="min-w-full divide-y divide-gray-200">
                <thead class="bg-gray-100 sticky top-0 z-10">
                    <tr>
                        </tr>
                </thead>
                <tbody class="bg-white divide-y divide-gray-200">
                    </tbody>
            </table>
        </div>
        <div id="statusMessage" class="mt-4 text-center text-gray-500"></div>
    </div>

    <div id="aiModal" class="modal">
        <div class="modal-content">
            <span class="close-button" onclick="closeAiModal()">&times;</span>
            <div class="modal-header" id="aiModalTitle">AI 助教建议</div>
            <div class="modal-body" id="aiModalBody">
                <div id="aiLoadingSpinner" class="loader" style="display: none;"></div>
                <div id="aiResponseArea"></div> {/* Changed to div for easier HTML appending */}
            </div>
            <div class="modal-footer">
                <button onclick="closeAiModal()" class="px-4 py-2 bg-blue-500 text-white rounded-md hover:bg-blue-600 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-opacity-50">关闭</button>
            </div>
        </div>
    </div>

    <script>
        // CSV Data Store
        const allData = {};

        // Headers (Chinese and corresponding keys for object properties)
        const CH_HEADERS = ["章节内容", "所在单元", "小节内容", "应用场景", "交互实例", "AI 助教"];
        const HEADER_KEYS = ["chapter", "unit", "section", "scenario", "interactionInstances", "aiActions"];

        // --- Data (Embedded CSV content) ---
        // Grade 3, Semester 1
        allData.grade3_sem1_csv = `章节内容,所在单元,小节内容,典型例题,交互类型,应用场景,交互实例1,交互实例2,补充阅读材料
时分秒,第一单元,秒的认识,,自由探索,概念引入,polypad.org/0vQ2sokbvK3xjA,,
时分秒,第一单元,时分秒转换,,测试练习,概念理解,略,,
时分秒,第一单元,过了多久,,原理演示,概念理解,https://www.geogebra.org/m/rSjV8S8q#material/xByruwgq,,
时分秒,第一单元,十二时辰,,拓展研究,拓展研究,暂缺,,
万以内的加减-1,第二单元,两位数+两位数,,自由探索,,概念理解,https://www.geogebra.org/m/av6psbf7#material/vgJ8ySBK,,
万以内的加减-1,第二单元,百几十+百几十,,自由探索,,概念理解,原理同上,,
万以内的加减-1,第二单元,加法凑整简便运算,,原理演示,概念理解,暂缺,,
万以内的加减-1,第二单元,两位数-两位数,,原理演示,概念理解,https://www.geogebra.org/m/av6psbf7#material/ZBnCfzbA,,
万以内的加减-1,第二单元,百几十-百几十,,原理演示,概念理解,缺,,
万以内的加减-1,第二单元,加减凑整简便运算,,原理演示,概念理解,暂缺,,
万以内的加减-1,第二单元,现-估算-够不够,,原理演示,概念理解,https://www.geogebra.org/m/ua4yNy75#material/RXW3jtCS,,
万以内的加减-1,第二单元,新-计算比较决策,,拓展研究,概念巩固,暂缺,,
万以内的加减-1,第二单元,新-算盘计算,,自由探索,拓展研究,暂缺,,
测量,第三单元,毫米,,自由探索,概念理解,暂缺,,
测量,第三单元,分米,,自由探索,概念理解,暂缺,,
测量,第三单元,千米,,自由探索,概念理解,暂缺,,
测量,第三单元,吨,,自由探索,概念理解,暂缺,,
测量,第三单元,新-估测距离&重量,,自由探索,概念巩固,暂缺,,
测量,第三单元,新-长度单位之古今中外,,自由探索,拓展研究,https://www.mathsisfun.com/measure/lengths-small-large.html,,
万以内的加减-2,第四单元,三位数+三位数,,原理演示,概念理解,同两位数+两位数,,
万以内的加减-2,第四单元,三位数-三位数,,原理演示,概念理解,同两位数-两位数,,
万以内的加减-2,第四单元,加减凑整简便运算,,原理演示,概念理解,同估算-够不够,,
万以内的加减-2,第四单元,新-估算&精确计算,,拓展研究,概念巩固,暂缺,,
万以内的加减-2,第四单元,新-百数表,,拓展研究,拓展研究,https://www.geogebra.org/m/av6psbf7#material/Yj76NGW6,,
倍的认识,第五单元,整倍数,,原理演示,概念理解,暂缺,,
倍的认识,第五单元,新-整倍数又多/少,,原理演示,概念理解,暂缺,,
倍的认识,第五单元,新-增减变整倍数,,拓展研究,概念巩固,暂缺,,
倍的认识,第五单元,新-和差倍问题,,拓展研究,拓展研究,暂缺,,
多位数乘一位数,第六单元,口算乘法,,原理演示,概念理解,https://www.geogebra.org/m/rSjV8S8q#material/wvuatys4,,
多位数乘一位数,第六单元,笔算乘法,,原理演示,概念理解,https://www.geogebra.org/m/ua4yNy75#material/btghQMnt,
多位数乘一位数,第六单元,笔算乘法-带0,,原理演示,概念理解,暂缺,,
多位数乘一位数,第六单元,格子乘法（lattice product）,,自由探索,拓展研究,拓展研究,https://www.geogebra.org/m/rSjV8S8q#material/M3Xu6DPK,,
多位数乘一位数,第六单元,估算够不够,,自由探索,拓展研究,暂缺,,
多位数乘一位数,第六单元,乘除混合运算,,原理演示,概念巩固,暂缺,,
多位数乘一位数,第六单元,新-“乘9”规律,,拓展研究,拓展研究,暂缺,,
长方形和正方形,第七单元,四边形,,原理演示,概念引入,缺,,
长方形和正方形,第七单元,长方形+正方形认识,,原理演示,概念巩固,长方形,https://www.geogebra.org/m/fUKh9xMH#material/hqzKRMGW,,正方形,https://www.geogebra.org/m/fUKh9xMH#material/Bdeu2Mxf",,
长方形和正方形,第七单元,长方形+正方形周长,略,原理演示,概念理解,https://www.geogebra.org/m/pvjjawmc#material/kbxGTNEd,,
长方形和正方形,第七单元,新-周长应用,,原理演示,概念理解,略,,
长方形和正方形,第七单元,新-数学实验,,拓展研究,拓展研究,缺,,
长方形和正方形,第七单元,新-组合图形周长,,自由探索, 拓展研究,拓展研究,组合图形构建,https://www.geogebra.org/m/rSjV8S8q#material/AfUJaTHa,,
分数的初步认识,第八单元,几分之一几分之几,,概念定义,概念引入,各类模型,https://www.geogebra.org/m/K7cDMUC7#material/jr5aapvh,数轴上位置：https://www.geogebra.org/m/K7cDMUC7#material/ZbtS3ufg,
分数的初步认识,第八单元,几分之一几分之几,,测试练习,概念巩固,https://www.geogebra.org/m/K7cDMUC7#material/Wd7NBkwM,,
分数的初步认识,第八单元,比较大小,略,原理演示,概念理解,简单版,https://www.geogebra.org/m/j4w554q8#material/QGDkZFu7,精细版,https://www.geogebra.org/m/j4w554q8#material/qwjhd8kx,,
分数的初步认识,第八单元,比较大小,,原理演示,概念理解,分数棒,polypad.org/q9r9MespyzsAYQ,,
分数的初步认识,第八单元,分数的简单计算,,原理演示,概念理解,饼图加减,https://www.geogebra.org/m/j4w554q8#material/BTCSvEDZ,块图加减,https://www.geogebra.org/m/j4w554q8#material/GceeVgnb,,
分数的初步认识,第八单元,新-整数的几分之几,,原理演示, 拓展研究,概念理解,可以用mathigon,,
分数的初步认识,第八单元,新-分母100的分数,,自由探索, 拓展研究,拓展研究,百-分数,https://www.geogebra.org/m/j4w554q8#material/NnxTD3pe,,
数学广角-集合,第九单元,集合交并-韦恩图,,自由探索, 原理演示,缺,,`;

        // Grade 3, Semester 2
        allData.grade3_sem2_csv = `章节内容,所在单元,小节内容,典型例题,交互类型,应用场景,交互实例1,交互实例2,补充阅读材料
位置与方向-1,第一单元,现实的东南西北,,自由探索,概念引入,暂缺,,
位置与方向-1,第一单元,地图的东南西北,,原理演示,概念理解,暂缺,,
位置与方向-1,第一单元,八个方向,,原理演示,概念理解,暂缺,,
位置与方向-1,第一单元,路线图,,拓展研究,拓展研究,暂缺,,
位置与方向-1,第一单元,新-指南针,,拓展研究,拓展研究,缺,,
除数是一位数的除法,第二单元,口算除法,,原理演示,概念理解,x,,
除数是一位数的除法,第二单元,笔算除法,,原理演示,概念理解,https://www.geogebra.org/m/rSjV8S8q#material/mS7PE6Yx,,
除数是一位数的除法,第二单元,商带0的笔算除法,,原理演示,概念理解,暂缺,,
除数是一位数的除法,第二单元,应用-估算,,原理演示,概念理解,暂缺,,
除数是一位数的除法,第二单元,应用-混合列式,,原理演示,概念理解,暂缺,,
除数是一位数的除法,第二单元,新-我们古代的除法,,拓展,拓展研究,暂缺,,
统计（复式统计表）,第三单元,复式统计表,,自由探索,概念理解,暂缺,,
统计（复式统计表）,第三单元,垃圾分类,,自由探索,概念理研究解,暂缺,,
统计（复式统计表）,第三单元,新-幸存者偏差,,拓展研究,拓展研究,x,,
两位数乘两位数,第四单元,口算乘法,,原理演示,概念理解,略,,
两位数乘两位数,第四单元,笔算乘法,,原理演示,概念理解,面积模型1,https://www.geogebra.org/m/j4w554q8#material/wvuatys4,面积模型2,https://www.geogebra.org/m/j4w554q8#material/btghQMnt,,
两位数乘两位数,第四单元,应用-连乘,,原理演示,概念巩固,略,,
两位数乘两位数,第四单元,应用-连除,,拓展研究,概念巩固,略,,
两位数乘两位数,第四单元,新-铺地锦,,拓展研究,拓展研究,https://www.geogebra.org/m/rSjV8S8q#material/M3Xu6DPK,,
两位数乘两位数,第四单元,新-清华简&数独,,拓展研究,拓展研究,x,,
面积,第五单元,什么是面积,,概念定义,概念理解,面积比较,https://www.geogebra.org/m/pvjjawmc#material/QAvaqhWU,周长&面积,https://www.geogebra.org/m/pvjjawmc#material/kbxGTNEd,,
面积,第五单元,常用的面积单位,,原理演示,概念理解,略,,
面积,第五单元,长/正方形面积公式,,原理演示,概念理解,https://www.geogebra.org/m/pvjjawmc#material/MtyPcDQP,,
面积,第五单元,应用-求面积,,测试练习,概念巩固,练习,https://www.geogebra.org/m/pvjjawmc#material/Yr8kxmtU,,
面积,第五单元,新-中国古代的面积单位&计算,,自由探索, 拓展研究,拓展研究,,
年月日,第六单元,年月日,,原理演示,概念理解,x,,
年月日,第六单元,24时计时法,,原理演示,概念理解,x,,
年月日,第六单元,时差问题,,原理演示,概念理解,暂缺,,
年月日,第六单元,新-二十四节气,,拓展研究,拓展研究,x,,
年月日,第六单元,新-生活中的时间周期现象,,原理演示,拓展研究,暂缺,,
小数的初步认识,第七单元,认识小数,,原理演示,概念引入,https://www.geogebra.org/m/j4w554q8#material/tt86wmtc,,数轴上,https://www.geogebra.org/m/j4w554q8#material/achKw2SG",猜小数：https://www.geogebra.org/m/j4w554q8#material/Kfy3chsG,
小数的初步认识,第七单元,简单的小数加减,,原理演示,概念理解,x,,
小数的初步认识,第七单元,应用-加减混合,,原理演示,概念巩固,,,
小数的初步认识,第七单元,新-小数的历史,,拓展研究,拓展研究,略,,
数学广角-搭配2,第八单元,加法原理,,概念定义, 原理演示,,,
数学广角-搭配2,第八单元,乘法原理,,概念定义, 原理演示,,,`;

        // Grade 4, Semester 1
        allData.grade4_sem1_csv = `章节内容,所在单元,小节内容,典型例题,交互类型,应用场景,交互实例1,交互实例2,补充阅读材料
大数的认识,第一单元,十进制&数位,,自由探索,概念引入,暂缺,,
大数的认识,第一单元,大数的读写,,原理演示,概念理解,暂缺,,
大数的认识,第一单元,近似数&改写,,原理演示,概念理解,暂缺,,
大数的认识,第一单元,新-其他进制,,拓展研究,拓展研究,暂缺,,
大数的认识,第一单元,新-1亿有多大,,拓展研究,拓展研究,,,
公顷和平方千米,第二单元,公顷和平方千米,,自由探索,原理演示,概念理解,,,
公顷和平方千米,第二单元,单位换算,,自由探索,原理演示,概念理解,,,
公顷和平方千米,第二单元,新-其他面积单位,,拓展研究,拓展研究,暂缺,,
角的度量,第三单元,线段直线射线,,自由探索,概念理解,,,
角的度量,第三单元,角的认识,,概念定义,概念理解,https://www.geogebra.org/m/dVXMR4U7#material/BnEZnNV6,,
角的度量,第三单元,角的度量,,拓展研究,概念巩固,https://www.geogebra.org/m/pvjjawmc#material/fMnsdbzv,练习,https://www.geogebra.org/m/pvjjawmc#material/vEMDpnEh,,
角的度量,第三单元,应用-密铺,,拓展研究,拓展研究,欣赏,https://www.geogebra.org/m/V2KZT7sh,https://www.geogebra.org/m/CUdKaHeC#material/b23bZznN,,
角的度量,第三单元,新-无处不在的角,,拓展研究,拓展研究,,,
三位数乘两位数,第四单元,笔算乘法,,原理演示,概念理解,略,,
三位数乘两位数,第四单元,积的变化规律,,原理演示,概念理解,,,
三位数乘两位数,第四单元,应用-速度时间路程,,原理演示,概念巩固,行程,https://www.geogebra.org/m/dVXMR4U7#material/N9cWPaX6,,
三位数乘两位数,第四单元,应用-单价数量总价,,拓展研究,概念巩固,略,,
三位数乘两位数,第四单元,新-限速标识,,拓展研究,拓展研究,,,
平行四边形和梯形,第五单元,概念-垂直&平行,,概念定义,概念理解,,,
平行四边形和梯形,第五单元,平行四边形,,原理演示,概念理解,切割平移,https://www.geogebra.org/m/pvjjawmc#material/D8rjsGzF,练习,https://www.geogebra.org/m/pvjjawmc#material/xdvumfag,,
平行四边形和梯形,第五单元,梯形,,原理演示,概念理解,切割旋转,https://www.geogebra.org/m/pvjjawmc#material/rktj8gqv,练习,https://www.geogebra.org/m/pvjjawmc#material/hjjzukgm,,
平行四边形和梯形,第五单元,应用-制作学具,,测试练习,概念巩固,,,
平行四边形和梯形,第五单元,新-菱形,,拓展研究,拓展研究,,,
除数是两位数的除法,第六单元,除数是整十的笔算,,原理演示,概念理解,,,
除数是两位数的除法,第六单元,除数非整十的笔算,,原理演示,概念理解,,,
除数是两位数的除法,第六单元,商的变化规律,,原理演示,概念理解,暂缺,,
除数是两位数的除法,第六单元,应用-混合运算,,概念定义,概念理解,,,
除数是两位数的除法,第六单元,新-不同的除法竖式,,拓展研究,拓展研究,暂缺,,
条形统计图,第七单元,认识条形统计图,,自由探索,原理演示,概念引入,,,
条形统计图,第七单元,绘制条形统计图,,原理演示,概念理解,https://www.geogebra.org/m/pvjjawmc#material/k2rhmjpz,,
条形统计图,第七单元,分析数据,,原理演示,概念巩固,,,
条形统计图,第七单元,新-透过数据看祖国,,拓展研究,拓展研究,略,,
数学广角-策略,第八单元,加法原理,,概念定义,概念理解,,,
数学广角-策略,第八单元,乘法原理,,概念定义,概念理解,,,
`;

        // Grade 4, Semester 2
        allData.grade4_sem2_csv = `章节内容,所在单元,小节内容,典型例题,交互类型,应用场景,交互实例1,交互实例2,补充阅读材料
四则运算,第一单元,加减法意义&各部分关系,,自由探索,概念引入,暂缺,,
四则运算,第一单元,乘除法意义&各部分关系,,原理演示,概念理解,暂缺,,
四则运算,第一单元,括号与运算顺序,,原理演示,概念理解,暂缺,,
四则运算,第一单元,应用-租船问题,,原理演示,概念理解,暂缺,,
四则运算,第一单元,新-,见学材,拓展研究,拓展研究,,,
观察物体-2,第二单元,三视图-形状不同,,自由探索, 原理演示,GGB,https://www.geogebra.org/m/rvz58cma#material/WTF5hPut,,
观察物体-2,第二单元,三视图-形状有同,,自由探索, 原理演示,概念理解,https://lusun.com/v/HRnA08El1Mk ,,
观察物体-2,第二单元,新-,见学材阅读材料,自由探索, 拓展研究,拓展研究,,,
运算定律,第三单元,加法交换结合律,,原理演示,概念理解,暂缺,,
运算定律,第三单元,减法性质,,原理演示,概念理解,暂缺,,
运算定律,第三单元,应用与连加,,测试练习,概念巩固,,,
运算定律,第三单元,乘法交换结合律,,原理演示,概念理解,交换律,https://www.geogebra.org/m/rfU3nHm9,,https://www.geogebra.org/m/mTTTJMNf",,
运算定律,第三单元,乘法分配律,,原理演示,概念理解,分配律（实物）,https://www.geogebra.org/m/N3zrj7XH,分配律（面积）,https://www.geogebra.org/m/DG2SGPYz",https://www.geogebra.org/m/uBFDkKgn,,
运算定律,第三单元,应用与简便计算,,测试练习,概念巩固,,,
运算定律,第三单元,新-,见学材阅读材料,自由探索,拓展研究,,,
小数的意义和性质,第四单元,小数的意义,,原理演示,概念理解,https://www.geogebra.org/m/j4w554q8#material/NnxTD3pe,,https://www.geogebra.org/m/vetk8nke#material/bRCprdb2","数轴上,https://www.geogebra.org/m/j4w554q8#material/Wn6gYc78,,
小数的意义和性质,第四单元,小数的读写,,原理演示,概念理解,数位顺序表,https://www.geogebra.org/m/j4w554q8#material/wQdkXRaM,,
小数的意义和性质,第四单元,小数的性质,,原理演示,概念理解,,,
小数的意义和性质,第四单元,小数的大小比较,,拓展研究, 原理演示,https://www.geogebra.org/m/RxEhUMeS,,
小数的意义和性质,第四单元,小数点的移动,,原理演示,概念理解,扩大缩小,https://www.geogebra.org/m/vetk8nke#material/qzP8qM7F,,
小数的意义和性质,第四单元,应用-货币兑换,,测试练习,概念巩固,,,
小数的意义和性质,第四单元,单位换算,,概念定义,概念理解,,,
小数的意义和性质,第四单元,小数的近似数&改写,,原理演示,概念理解,,,
小数的意义和性质,第四单元,新-,,拓展研究,拓展研究,,,
三角形,第五单元,三角形特性,,概念定义,概念理解,,,
三角形,第五单元,三角形三边关系,,原理演示,概念理解,给小棒,https://www.geogebra.org/m/PEKCQJEF,通过圆,https://www.geogebra.org/m/brzJSjSZ",给定边画三角形,https://www.geogebra.org/m/zAfuZrN7,,
三角形,第五单元,三角形分类,,原理演示,概念理解,分类,https://www.geogebra.org/m/dVXMR4U7#material/QuqhkcC2,,
三角形,第五单元,三角形内角和,,自由探索,概念巩固,内角和,https://www.geogebra.org/m/VdBv7Ufp#:~:text=The%20angles%20of%20a%20triangle,%E2%80%93%20GeoGebra",,
三角形,第五单元,新-,见学材阅读材料,自由探索, 拓展研究,拓展研究,,,
小数的加法和减法,第六单元,小数加减,,原理演示,概念理解,GGB完整课程,https://www.geogebra.org/m/dVXMR4U7#material/krpt9tms,,
小数的加法和减法,第六单元,小数加减混合,,原理演示,概念理解,,,
小数的加法和减法,第六单元,运算律推广到小数,,原理演示,概念理解,暂缺,,
小数的加法和减法,第六单元,应用-混合运算,,测试练习,概念巩固,,,
小数的加法和减法,第六单元,新-,,自由探索,,拓展研究,暂缺,,
图形的运动-2,第七单元,轴对称,,自由探索, 原理演示,概念理解,https://www.geogebra.org/m/pvjjawmc#material/Ba9feZPw,练习,https://www.geogebra.org/m/dVXMR4U7#material/n83kghjU,,
图形的运动-2,第七单元,平移,,原理演示,概念理解,https://www.geogebra.org/m/BDzKR5st,https://www.geogebra.org/m/kj9wTYtj#material/qMhPbxBT,,
图形的运动-2,第七单元,应用-平移求面积,,原理演示,概念巩固,,,
图形的运动-2,第七单元,新-,见学材阅读材料,拓展研究,拓展研究,略,,
统计,第八单元,平均数,,原理演示,概念理解,平均数和中位数,https://www.geogebra.org/m/pvjjawmc#material/k9k6sx2v,自由输入,https://www.geogebra.org/m/pvjjawmc#material/qd7tr6Pr,,
统计,第八单元,复式条形统计图,,概念定义,概念理解,单式条形图,https://www.geogebra.org/m/pvjjawmc#material/W25rTkxu,,
数学广角,第九单元,鸡兔同笼,,自由探索, 原理演示,拓展研究,https://media.mosmps.edu.hk/subj/maths/geogebra/viewLink.php?linkID=057,,
`;
        // Grade 5, Semester 1
        allData.grade5_sem1_csv = `章节内容,所在单元,小节内容,典型例题,交互类型,应用场景,交互实例1,交互实例2,补充阅读材料
小数乘法,第一单元,小数乘整数,,自由探索,概念引入,暂缺,,
小数乘法,第一单元,小数乘小数,,原理演示,概念理解,暂缺,,
小数乘法,第一单元,积的近似数,,原理演示,概念理解,暂缺,,
小数乘法,第一单元,乘法运算律到小数,,原理演示,概念理解,暂缺,,
小数乘法,第一单元,新-,,拓展研究,拓展研究,,,
位置,第二单元,数对表示位置,,原理演示,概念理解,,,
位置,第二单元,应用-,,原理演示,概念理解,,,
位置,第二单元,新-,,拓展研究,拓展研究,,,
小数除法,第三单元,除数是整数,,原理演示,概念理解,暂缺,,
小数除法,第三单元,除数是小数,,原理演示,概念理解,暂缺,,
小数除法,第三单元,商的近似数,,原理演示,概念理解,,,
小数除法,第三单元,循环小数,,原理演示,概念理解,,,
小数除法,第三单元,计算器探索规律,,原理演示,概念理解,,,
小数除法,第三单元,应用-,,测试练习,概念巩固,,,
小数除法,第三单元,新-,,拓展研究,拓展研究,,,
可能性,第四单元,可能性认识,,原理演示,概念理解,,,
可能性,第四单元,有放回摸1球,,原理演示,概念理解,,,
可能性,第四单元,有放回摸2球,,原理演示,概念理解,,,
可能性,第四单元,新-,,拓展研究,拓展研究,,,
简易方程,第五单元,用字母表示数,,概念定义,概念理解,,,
简易方程,第五单元,用字母表示量与关系,,原理演示,概念理解,,,
简易方程,第五单元,等式的性质,,原理演示,概念理解,,,
简易方程,第五单元,解方程,,原理演示,概念理解,,,
简易方程,第五单元,实际问题与方程,,测试练习,概念巩固,,,
简易方程,第五单元,应用-相遇问题,,拓展研究,拓展研究,,,
简易方程,第五单元,新-,,自由探索,拓展研究,,,
多边形的面积,第六单元,平行四边形,,原理演示,概念理解,https://www.geogebra.org/m/pvjjawmc#material/D8rjsGzF,https://www.geogebra.org/m/stfH3MkX,,
多边形的面积,第六单元,三角形,,原理演示,概念理解,"长方形一半,https://www.geogebra.org/m/jmgu5t2z,,动画,https://www.geogebra.org/m/FwsnSVFB",旋转,https://www.geogebra.org/m/wPHZ2VcU,,
多边形的面积,第六单元,梯形,,原理演示,概念理解,腰线分割,https://www.geogebra.org/m/pvjjawmc#material/rktj8gqv,旋转,https://www.geogebra.org/m/TKteXNwE,,
多边形的面积,第六单元,组合图形,,测试练习,概念巩固,,,
多边形的面积,第六单元,新-,,拓展研究,拓展研究,暂缺,,
数学广角-植树问题,第七单元,两边都植,,原理演示,概念理解,,,
数学广角-植树问题,第七单元,一边植,,原理演示,概念理解,,,
数学广角-植树问题,第七单元,两边都不植,,原理演示,概念理解,,,
数学广角-植树问题,第七单元,新-,,拓展研究,拓展研究,略,,`;

        // Grade 5, Semester 2
        allData.grade5_sem2_csv = `章节内容,所在单元,小节内容,典型例题,交互类型,应用场景,交互实例1,交互实例2,补充阅读材料
观察物体-3,第一单元,一视图反推立体图,,自由探索,概念引入,暂缺,,
观察物体-3,第一单元,三视图反推立体图,,原理演示,概念理解,https://www.tinkercad.com/things/8YZZb3sAVob-shiny-snicket-jaiks/edit,https://www.netpad.net.cn/svg.html#posts/147967,,
观察物体-3,第一单元,新-,,拓展研究,拓展研究,,,
因数与倍数,第二单元,因数倍数,,自由探索, 原理演示,概念理解,,,
因数与倍数,第二单元,2/3/5倍数的特征,,自由探索, 原理演示,概念理解,https://mathigon.org/polypad/0BuYsMlVwOwQA,,
因数与倍数,第二单元,质数合数,,自由探索, 原理演示,概念理解,https://mathigon.org/polypad/Pi8fGSrB1kn0RA,,
因数与倍数,第二单元,新-,见学材阅读材料,"自由探索, 原理演示",拓展研究,,,
长方体和正方体,第三单元,长方体的认识,,原理演示,概念理解,,,
长方体和正方体,第三单元,正方体的认识,,原理演示,概念理解,暂缺,,
长方体和正方体,第三单元,长/正方体的表面积,,原理演示,概念理解,展开与三面,https://www.geogebra.org/m/jwk6kqfa#material/fmbmkpj7,正方体展开,https://www.geogebra.org/m/QAPeq2cw,,
长方体和正方体,第三单元,长/正方体的体积,,原理演示,概念理解,体积块,https://www.geogebra.org/m/jwk6kqfa#material/dp6ghmvv,,
长方体和正方体,第三单元,单位换算,,原理演示,概念理解,,,
长方体和正方体,第三单元,应用-容积,,测试练习,概念巩固,,,
长方体和正方体,第三单元,新-,见学材阅读材料,"自由探索, 拓展研究",拓展研究,,,
分数的意义和性质,第四单元,分数的意义,,原理演示,概念理解,分数模型,https://www.geogebra.org/m/MSFCTyph,,
分数的意义和性质,第四单元,真分数假分数,,原理演示,概念理解,https://www.geogebra.org/m/NnxTD3pe,,
分数的意义和性质,第四单元,分数的性质,,原理演示,概念理解,https://www.geogebra.org/m/fhhc7e6d,,移动重合,https://www.geogebra.org/m/JA6gDkk7,https://www.geogebra.org/m/nkj76TKW,,
分数的意义和性质,第四单元,约分,,原理演示,概念理解,,,
分数的意义和性质,第四单元,通分,,原理演示,概念理解,约分通分以及为加减奠基,https://www.geogebra.org/m/EJC86jWe,,
分数的意义和性质,第四单元,分数小数互化,,原理演示,概念理解,,,
分数的意义和性质,第四单元,新-,,拓展研究,拓展研究,,,
图形的运动-3,第五单元,平移,,概念定义,概念理解,,,
图形的运动-3,第五单元,旋转,,原理演示,概念理解,,,
图形的运动-3,第五单元,组合,,原理演示,概念理解,,,
图形的运动-3,第五单元,新-,,自由探索, 拓展研究,拓展研究,,,
分数的加法和减法,第六单元,同分母加减法,,原理演示,概念理解,,,
分数的加法和减法,第六单元,异分母加减法,,原理演示,概念理解,https://www.geogebra.org/m/GceeVgnb,,
分数的加法和减法,第六单元,分数加减混合,,原理演示,概念理解,,,
分数的加法和减法,第六单元,应用-,,测试练习,概念巩固,,,
分数的加法和减法,第六单元,新-,,自由探索,拓展研究,暂缺,,
统计,第七单元,折线统计图,,原理演示,概念理解,,,
统计,第七单元,复式折线统计图,,原理演示,概念理解,,,
统计,第七单元,分析推断,,原理演示,概念理解,,,
统计,第七单元,新-,,拓展研究,拓展研究,略,,
数学广角,第八单元,找次品,,拓展研究,拓展研究,polypad.org/eM0nPGxl7AgZA,,`;

        // Grade 6, Semester 1
        allData.grade6_sem1_csv = `章节内容,所在单元,小节内容,典型例题,交互类型,应用场景,交互实例1,交互实例2,补充阅读材料
观察物体-3,第一单元,一视图反推立体图,,自由探索,概念引入,暂缺,,
观察物体-3,第一单元,三视图反推立体图,,原理演示,概念理解,https://www.tinkercad.com/things/8YZZb3sAVob-shiny-snicket-jaiks/edit,https://www.netpad.net.cn/svg.html#posts/147967,,
观察物体-3,第一单元,新-,,拓展研究,拓展研究,,,
因数与倍数,第二单元,因数倍数,,原理演示,概念理解,,,
因数与倍数,第二单元,2/3/5倍数的特征,,原理演示,概念理解,https://mathigon.org/polypad/0BuYsMlVwOwQA,,
因数与倍数,第二单元,质数合数,,原理演示,概念理解,https://mathigon.org/polypad/Pi8fGSrB1kn0RA,,
因数与倍数,第二单元,新-,,原理演示,拓展研究,,,
长方体和正方体,第三单元,长方体的认识,,原理演示,概念理解,,,
长方体和正方体,第三单元,正方体的认识,,原理演示,概念理解,暂缺,,
长方体和正方体,第三单元,长/正方体的表面积,,原理演示,概念理解,展开与三面,https://www.geogebra.org/m/jwk6kqfa#material/fmbmkpj7,正方体展开,https://www.geogebra.org/m/QAPeq2cw,,
长方体和正方体,第三单元,长/正方体的体积,,原理演示,概念理解,体积块,https://www.geogebra.org/m/jwk6kqfa#material/dp6ghmvv,,
长方体和正方体,第三单元,单位换算,,原理演示,概念理解,,,
长方体和正方体,第三单元,应用-容积,,测试练习,概念巩固,,,
长方体和正方体,第三单元,新-,,拓展研究,拓展研究,,,
分数的意义和性质,第四单元,分数的意义,,原理演示,概念理解,分数模型,https://www.geogebra.org/m/MSFCTyph,,
分数的意义和性质,第四单元,真分数假分数,,原理演示,概念理解,https://www.geogebra.org/m/NnxTD3pe,,
分数的意义和性质,第四单元,分数的性质,,原理演示,概念理解,https://www.geogebra.org/m/fhhc7e6d,,移动重合,https://www.geogebra.org/m/JA6gDkk7,https://www.geogebra.org/m/nkj76TKW,,
分数的意义和性质,第四单元,约分,,原理演示,概念理解,,,
分数的意义和性质,第四单元,通分,,原理演示,概念理解,约分通分以及为加减奠基,https://www.geogebra.org/m/EJC86jWe,,
分数的意义和性质,第四单元,分数小数互化,,原理演示,概念理解,,,
分数的意义和性质,第四单元,新-,,拓展研究,拓展研究,,,
图形的运动-3,第五单元,平移,,概念定义,概念理解,,,
图形的运动-3,第五单元,旋转,,原理演示,概念理解,,,
图形的运动-3,第五单元,组合,,原理演示,概念理解,,,
图形的运动-3,第五单元,新-,,拓展研究,拓展研究,,,
分数的加法和减法,第六单元,同分母加减法,,原理演示,概念理解,,,
分数的加法和减法,第六单元,异分母加减法,,原理演示,概念理解,https://www.geogebra.org/m/GceeVgnb,,
分数的加法和减法,第六单元,分数加减混合,,原理演示,概念理解,,,
分数的加法和减法,第六单元,应用-,,测试练习,概念巩固,,,
分数的加法和减法,第六单元,新-,,拓展研究,拓展研究,暂缺,,
统计,第七单元,折线统计图,,原理演示,概念理解,,,
统计,第七单元,复式折线统计图,,原理演示,概念理解,,,
统计,第七单元,分析推断,,原理演示,概念理解,,,
统计,第七单元,新-,,拓展研究,拓展研究,略,,
数学广角,第八单元,找次品,,拓展研究,拓展研究,polypad.org/eM0nPGxl7AgZA,,`;

        // Grade 6, Semester 2
        allData.grade6_sem2_csv = `章节内容,所在单元,小节内容,典型例题,交互类型,应用场景,交互实例1,交互实例2,补充阅读材料
观察物体-3,第一单元,一视图反推立体图,,自由探索,概念引入,暂缺,,
观察物体-3,第一单元,三视图反推立体图,,原理演示,概念理解,https://www.tinkercad.com/things/8YZZb3sAVob-shiny-snicket-jaiks/edit,https://www.netpad.net.cn/svg.html#posts/147967,,
观察物体-3,第一单元,新-,见学材,拓展研究,拓展研究,,,
因数与倍数,第二单元,因数倍数,,原理演示,概念理解,,,
因数与倍数,第二单元,2/3/5倍数的特征,,原理演示,概念理解,https://mathigon.org/polypad/0BuYsMlVwOwQA,,
因数与倍数,第二单元,质数合数,,原理演示,概念理解,https://mathigon.org/polypad/Pi8fGSrB1kn0RA,,
因数与倍数,第二单元,新-,,原理演示,拓展研究,,,
长方体和正方体,第三单元,长方体的认识,,原理演示,概念理解,,,
长方体和正方体,第三单元,正方体的认识,,原理演示,概念理解,暂缺,,
长方体和正方体,第三单元,长/正方体的表面积,,原理演示,概念理解,展开与三面,https://www.geogebra.org/m/jwk6kqfa#material/fmbmkpj7,正方体展开,https://www.geogebra.org/m/QAPeq2cw,,
长方体和正方体,第三单元,长/正方体的体积,,原理演示,概念理解,体积块,https://www.geogebra.org/m/jwk6kqfa#material/dp6ghmvv,,
长方体和正方体,第三单元,单位换算,,原理演示,概念理解,,,
长方体和正方体,第三单元,应用-容积,,测试练习,概念巩固,,,
长方体和正方体,第三单元,新-,,拓展研究,拓展研究,,,
分数的意义和性质,第四单元,分数的意义,,原理演示,概念理解,分数模型：https://www.geogebra.org/m/MSFCTyph,,
分数的意义和性质,第四单元,真分数假分数,,原理演示,概念理解,https://www.geogebra.org/m/NnxTD3pe,,
分数的意义和性质,第四单元,分数的性质,,原理演示,概念理解,https://www.geogebra.org/m/fhhc7e6d,,移动重合：https://www.geogebra.org/m/JA6gDkk7,https://www.geogebra.org/m/nkj76TKW,,
分数的意义和性质,第四单元,约分,,原理演示,概念理解,,,
分数的意义和性质,第四单元,通分,,原理演示,概念理解,约分通分以及为加减奠基：https://www.geogebra.org/m/EJC86jWe,,
分数的意义和性质,第四单元,分数小数互化,,原理演示,概念理解,,,
分数的意义和性质,第四单元,新-,,拓展研究,拓展研究,,,
图形的运动-3,第五单元,平移,,概念定义,概念理解,,,
图形的运动-3,第五单元,旋转,,原理演示,概念理解,,,
图形的运动-3,第五单元,组合,,原理演示,概念理解,,,
图形的运动-3,第五单元,新-,,拓展研究,拓展研究,,,
分数的加法和减法,第六单元,同分母加减法,,原理演示,概念理解,,,
分数的加法和减法,第六单元,异分母加减法,,原理演示,概念理解,https://www.geogebra.org/m/GceeVgnb,,
分数的加法和减法,第六单元,分数加减混合,,原理演示,概念理解,,,
分数的加法和减法,第六单元,应用-,,测试练习,概念巩固,,,
分数的加法和减法,第六单元,新-,,拓展研究,拓展研究,暂缺,,
统计,第七单元,折线统计图,,原理演示,概念理解,,,
统计,第七单元,复式折线统计图,,原理演示,概念理解,,,
统计,第七单元,分析推断,,原理演示,概念理解,,,
统计,第七单元,新-,,拓展研究,拓展研究,略,,
数学广角,第八单元,找次品,,拓展研究,拓展研究,polypad.org/eM0nPGxl7AgZA,,`;
        // --- End of Data ---

        let currentDataset = []; 

        // DOM Elements
        const gradeSelect = document.getElementById('gradeSelect');
        const semesterSelect = document.getElementById('semesterSelect');
        const unitSelect = document.getElementById('unitSelect');
        const searchInput = document.getElementById('searchInput');
        const tableHead = document.querySelector('#tableContainer table thead tr');
        const tableBody = document.querySelector('#tableContainer table tbody');
        const statusMessage = document.getElementById('statusMessage');
        const aiModal = document.getElementById('aiModal');
        const aiModalTitle = document.getElementById('aiModalTitle');
        const aiResponseArea = document.getElementById('aiResponseArea');
        const aiLoadingSpinner = document.getElementById('aiLoadingSpinner');

        /**
         * Parses CSV text into an array of objects based on the new structure.
         * @param {string} csvText - The raw CSV string.
         * @returns {object[]} Array of row objects.
         */
        function parseCSV(csvText) {
            const lines = csvText.trim().split('\n');
            lines.shift(); // Remove header line from CSV
            const result = [];

            lines.forEach(line => {
                const values = line.split(','); 
                const rowObject = {};

                rowObject.chapter = values[0] ? values[0].trim() : '';
                rowObject.unit = values[1] ? values[1].trim() : '';
                rowObject.section = values[2] ? values[2].trim() : '';
                // values[3] (典型例题) - skipped
                // values[4] (交互类型) - skipped
                rowObject.scenario = values[5] ? values[5].trim() : '';
                
                let instance1 = values[6] ? values[6].trim() : '';
                let instance2 = values[7] ? values[7].trim() : '';
                
                let combinedInstances = (instance1 === "暂缺" || instance1 === "略" || !instance1) ? "" : instance1;
                if (instance2 && instance2 !== "暂缺" && instance2 !== "略") {
                    if (combinedInstances) {
                        combinedInstances += '\n' + instance2; 
                    } else {
                        combinedInstances = instance2;
                    }
                }
                rowObject.interactionInstances = combinedInstances;
                // values[8] (补充阅读材料) - skipped
                rowObject.aiActions = ''; // Placeholder for the button column

                result.push(rowObject);
            });
            return result;
        }
        
        /**
         * Sanitizes text to prevent HTML injection.
         * @param {string} text - The text to sanitize.
         * @returns {string} Sanitized text.
         */
        function sanitizeHTML(text) {
            if (typeof text !== 'string') return '';
            const temp = document.createElement('div');
            temp.textContent = text;
            return temp.innerHTML;
        }

        /**
         * Renders data into the HTML table.
         * @param {object[]} dataArray - Array of row objects to display.
         */
        function renderTable(dataArray) {
            tableBody.innerHTML = ''; 
            statusMessage.textContent = '';

            if (!dataArray || dataArray.length === 0) {
                const tr = tableBody.insertRow();
                const td = tr.insertCell();
                td.colSpan = CH_HEADERS.length;
                td.textContent = '没有找到匹配的数据。 (No matching data found.)';
                td.className = 'text-center py-4 px-6 text-gray-500';
                return;
            }

            dataArray.forEach(rowObject => {
                const tr = tableBody.insertRow();
                HEADER_KEYS.forEach(key => {
                    const td = tr.insertCell();
                    if (key === "aiActions") {
                        const button = document.createElement('button');
                        button.innerHTML = `✨ 生成活动建议`;
                        button.className = "bg-purple-500 hover:bg-purple-600 text-white text-xs py-1 px-2 rounded-md shadow transition duration-150 ease-in-out";
                        button.onclick = () => handleGenerateActivityIdeasClick(rowObject);
                        td.appendChild(button);
                        td.className = 'py-3 px-4 border-b border-gray-200 text-sm text-center';
                    } else if (key === "interactionInstances") {
                        let cellData = rowObject[key] || '';
                        td.innerHTML = ''; // Clear cell content
                        const links = cellData.split('\n').map(link => link.trim()).filter(link => link && link !== "暂缺" && link !== "略");
                        
                        if (links.length > 0) {
                            links.forEach((linkText, index) => {
                                if (index > 0) td.appendChild(document.createElement('br'));

                                if (linkText.startsWith('http://') || linkText.startsWith('https://') || linkText.includes('polypad.org/')) {
                                    const url = linkText.startsWith('polypad.org/') && !linkText.startsWith('http') ? 'https://' + linkText : linkText;
                                    const anchor = document.createElement('a');
                                    anchor.href = url; // Use raw URL for href
                                    anchor.target = '_blank';
                                    anchor.className = 'text-blue-500 hover:text-blue-700 hover:underline';
                                    anchor.textContent = sanitizeHTML(linkText); // Sanitize for display
                                    td.appendChild(anchor);
                                } else {
                                    td.appendChild(document.createTextNode(sanitizeHTML(linkText)));
                                }
                            });
                        } else {
                             td.textContent = "无"; // Or "N/A" or "暂无"
                        }
                         td.className = 'py-3 px-4 border-b border-gray-200 text-sm text-gray-700';
                    } else {
                        let cellData = rowObject[key] || '';
                        td.textContent = sanitizeHTML(cellData);
                        td.className = 'py-3 px-4 border-b border-gray-200 text-sm text-gray-700';
                    }
                });
            });
        }
        
        /**
         * Updates the unit dropdown based on the data for the selected grade and semester.
         * @param {object[]} dataForGradeSemester - Array of row objects for the current grade/semester.
         */
        function updateUnitDropdown(dataForGradeSemester) {
            const uniqueUnits = [...new Set(dataForGradeSemester.map(item => item.unit).filter(unit => unit))]; 
            unitSelect.innerHTML = '<option value="all">所有单元 (All Units)</option>'; 
            uniqueUnits.forEach(unit => {
                const option = document.createElement('option');
                option.value = unit;
                option.textContent = sanitizeHTML(unit);
                unitSelect.appendChild(option);
            });
            unitSelect.value = 'all'; 
        }


        /**
         * Filters the current dataset based on selections and search text, then re-renders the table.
         */
        function filterAndRender() {
            const searchText = searchInput.value.toLowerCase().trim();
            const selectedGrade = gradeSelect.value;
            const selectedSemester = semesterSelect.value;
            const dataKey = `grade${selectedGrade}_sem${selectedSemester}`;
            const rawCsvData = allData[dataKey + '_csv'];

            if (!rawCsvData) { // Should be handled by loadData, but as a safeguard
                currentDataset = [];
                renderTable(currentDataset);
                statusMessage.textContent = '请选择有效的数据集。(Please select a valid dataset.)';
                return;
            }
            
            const parsedData = parseCSV(rawCsvData);
            let dataToFilter = parsedData;
            const selectedUnit = unitSelect.value;

            if (selectedUnit !== 'all') {
                dataToFilter = dataToFilter.filter(row => row.unit === selectedUnit);
            }

            if (!searchText) {
                currentDataset = dataToFilter;
            } else {
                currentDataset = dataToFilter.filter(row => {
                    return HEADER_KEYS.some(key => {
                        if (key === "aiActions") return false; 
                        const cellValue = String(row[key] || '').toLowerCase();
                        return cellValue.includes(searchText);
                    });
                });
            }
            renderTable(currentDataset);
            statusMessage.textContent = `显示 ${currentDataset.length} 条记录。 (Showing ${currentDataset.length} records.)`;
        }

        /**
         * Loads data based on dropdown selections, updates unit dropdown, and renders the table.
         */
        function loadData() {
            const selectedGrade = gradeSelect.value;
            const selectedSemester = semesterSelect.value;
            const dataKey = `grade${selectedGrade}_sem${selectedSemester}`;
            const rawCsvData = allData[dataKey + '_csv'];

            if (!rawCsvData) {
                currentDataset = [];
                renderTable(currentDataset);
                updateUnitDropdown([]); 
                statusMessage.textContent = '请选择有效的数据集。(Please select a valid dataset.)';
                return;
            }
            const parsedDataForDropdown = parseCSV(rawCsvData);
            updateUnitDropdown(parsedDataForDropdown); 
            
            filterAndRender(); 
        }
        
        /**
         * Helper function to create a list of clickable links for the modal.
         * @param {string} linksText - Combined string of links, separated by newlines.
         * @returns {string} HTML string for an unordered list of links.
         */
        function extractAndFormatLinksForModal(linksText) {
            const links = linksText.split('\n').map(link => link.trim()).filter(link => link && link !== "暂缺" && link !== "略");
            if (links.length === 0) return '';

            let html = '<ul class="list-disc list-inside pl-2 text-sm mt-2">';
            links.forEach(linkText => {
                if (linkText.startsWith('http://') || linkText.startsWith('https://') || linkText.includes('polypad.org/')) {
                    const url = linkText.startsWith('polypad.org/') && !linkText.startsWith('http') ? 'https://' + linkText : linkText;
                    html += `<li><a href="${url}" target="_blank" class="text-blue-500 hover:text-blue-700 hover:underline">${sanitizeHTML(linkText)}</a></li>`;
                } else {
                     // Optionally display non-URL text if it's meaningful
                    // html += `<li>${sanitizeHTML(linkText)} (非链接)</li>`;
                }
            });
            html += '</ul>';
            return links.some(lt => lt.startsWith('http://') || lt.startsWith('https://') || lt.includes('polypad.org/')) ? html : '';
        }


        /**
         * Handles click on "Generate Activity Ideas" button.
         * @param {object} rowData - The data for the clicked row.
         */
        async function handleGenerateActivityIdeasClick(rowData) {
            const chapter = rowData.chapter || "未知章节";
            const section = rowData.section || "未知小节";

            aiModalTitle.textContent = `活动建议: ${sanitizeHTML(chapter)} - ${sanitizeHTML(section)}`;
            aiResponseArea.innerHTML = ''; // Clear previous content
            aiLoadingSpinner.style.display = 'block';
            aiModal.style.display = 'flex'; 

            const prompt = `作为一名小学数学老师的AI助手，请为以下教学内容提供3个创新且实用的课堂活动建议。请确保建议适合小学生（例如三年级到六年级），并能帮助他们理解概念、提高参与度。
教学内容主题: ${chapter}
具体小节: ${section}
请用中文回答，每个建议点请另起一行并用数字编号（例如 1. 活动名称：说明...）。在你的建议中，如果提到可以使用交互式示例，请使用诸如“（可参考提供的交互实例）”这样的表述来提示老师。`;

            try {
                const generatedText = await callGeminiApi(prompt);
                // Display AI generated text (newlines should be preserved by pre-wrap)
                const aiTextNode = document.createElement('p');
                aiTextNode.textContent = generatedText;
                aiResponseArea.appendChild(aiTextNode);

                // Add related interactive resources
                const instanceLinks = rowData.interactionInstances || "";
                if (instanceLinks.trim()) {
                    const linksHTML = extractAndFormatLinksForModal(instanceLinks);
                    if (linksHTML) {
                        const resourcesDiv = document.createElement('div');
                        resourcesDiv.className = 'mt-4 pt-3 border-t border-gray-200';
                        resourcesDiv.innerHTML = `<h4 class="text-sm font-semibold mb-1 text-gray-700">相关交互资源:</h4>${linksHTML}`;
                        aiResponseArea.appendChild(resourcesDiv);
                    }
                }

            } catch (error) {
                console.error("Gemini API Error:", error);
                aiResponseArea.innerHTML = `<p class="text-red-500">抱歉，AI建议生成失败，请稍后再试。 (Sorry, failed to generate AI suggestions. Please try again later.)<br>${sanitizeHTML(error.message)}</p>`;
            } finally {
                aiLoadingSpinner.style.display = 'none';
            }
        }

        /**
         * Calls the Gemini API.
         * @param {string} promptText - The prompt to send to the API.
         * @returns {Promise<string>} The generated text.
         */
        async function callGeminiApi(promptText) {
            const apiKey = ""; 
            const apiUrl = `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${apiKey}`;
            
            const payload = {
                contents: [{
                    role: "user",
                    parts: [{ text: promptText }]
                }]
            };

            const response = await fetch(apiUrl, {
                method: 'POST',
                headers: { 'Content-Type': 'application/json' },
                body: JSON.stringify(payload)
            });

            if (!response.ok) {
                const errorBody = await response.json();
                console.error("API Error Response:", errorBody);
                throw new Error(`API request failed with status ${response.status}: ${errorBody?.error?.message || response.statusText}`);
            }

            const result = await response.json();

            if (result.candidates && result.candidates.length > 0 &&
                result.candidates[0].content && result.candidates[0].content.parts &&
                result.candidates[0].content.parts.length > 0) {
                return result.candidates[0].content.parts[0].text;
            } else {
                console.error("Unexpected API response structure:", result);
                throw new Error("未能从AI获取有效回复。(Failed to get a valid response from AI.)");
            }
        }

        /**
         * Closes the AI modal.
         */
        function closeAiModal() {
            aiModal.style.display = 'none';
            aiLoadingSpinner.style.display = 'none';
            aiResponseArea.innerHTML = ''; // Clear content
        }


        /**
         * Initializes the application.
         */
        function initialize() {
            tableHead.innerHTML = ''; 
            CH_HEADERS.forEach(headerText => {
                const th = document.createElement('th');
                th.textContent = headerText;
                th.className = 'px-4 py-3 text-left text-xs font-medium text-gray-600 uppercase tracking-wider';
                if (headerText === "AI 助教") { 
                    th.classList.add('text-center');
                }
                tableHead.appendChild(th);
            });

            gradeSelect.addEventListener('change', loadData);
            semesterSelect.addEventListener('change', loadData);
            unitSelect.addEventListener('change', filterAndRender); // Filter when unit changes
            searchInput.addEventListener('input', filterAndRender); 

            window.onclick = function(event) {
                if (event.target == aiModal) {
                    closeAiModal();
                }
            }
            
            loadData(); // Load initial data and populate unit dropdown
        }

        document.addEventListener('DOMContentLoaded', initialize);

    </script>
</body>
</html>
